﻿/************************************************************************
 * author:漠然 2013年7月12日4:25:15
 * 2013年7月13日16:52:33 通过在manager中通过反射实现了类型转换
 * **********************************************************************/


using System;
using System.Collections.Concurrent;
using System.Collections.Generic;
using System.Diagnostics;
using System.Windows.Forms;
using MuYue.Config;

namespace Mrsoft.Common {
    /// <summary>
    /// 通用配置文件基础类
    /// 用来存放数据变更的主要依据
    /// </summary>
    class Config<T> {
        AppConfig<T> config;

        /// <summary>
        /// 构造函数
        /// </summary>
        /// <param name="managerName">文档文件存放的具体位置</param>
        /// <param name="key">配置的搜索路径</param>
        /// <param name="defaultValue">默认值</param>
        public Config(string managerName, string key, T defaultValue) {
            managerName = managerName.Replace("/", "\\");
            var manger = AppConfigManager.Create(managerName);
            config = manger.GetConfig(key, defaultValue);
            //如果旧版配置文件存在 就会用旧版本文件配置项来更新数据库里面的配置内容
            if (ConfigManager.GetValue(managerName, key, ref defaultValue)) {
                this.config.Value = defaultValue;
            }
        }

        #region 值的内存缓存
        public T Value {
            set { this.config.Value = value; }
            get { return this.config.Value; }
        }
        #endregion


        public override string ToString() {
            return Value.ToString();
        }

        /// <summary>
        /// 设置控件绑定
        /// </summary>
        /// <param name="control"></param>
        /// <param name="propertyName"></param>
        public void SetBind(Control control, string propertyName, bool global = false) {
            //不是全局性质的就注册到可清理的列表里面
            if (!global)
                ConfigFactory.BindingControlRegister(control);
            control.DataBindings.Clear();
            control.DataBindings.Add(propertyName, this, "Value", true, DataSourceUpdateMode.OnPropertyChanged);
        }
    }
}
